package com.luxsoft.siipap.migracion;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;
import org.apache.commons.lang.StringUtils;
import org.springframework.jdbc.core.RowMapper;

import com.luxsoft.siipap.model.Direccion;
import com.luxsoft.siipap.model.core.Proveedor;



public class ImportadorDeProveedores extends ImportadorGeneral{
	
	public ImportadorDeProveedores(){
		setMapper(new ProveedorMapper());
	}
	
	/**
	 * Actualiza el catalogo de productos en las propiedades indicadas
	 *  
	 * 
	 */
	public void actualizar(){
		//Leemos todos los articulos del DBF
		
		List<Proveedor> rows=getSourceJdbcTemplate().query(getSql(), getMapper());
		System.out.println("Proveeodres en Oracle: "+rows.size());
		List<Proveedor> beans=getUniversalDao().getAll(Proveedor.class);
		System.out.println("Proveedores en MySql: "+beans.size());
		for(final Proveedor source:rows){
			final Proveedor target=(Proveedor) CollectionUtils.find(beans, new Predicate(){
				public boolean evaluate(Object input) {
					Proveedor pp=(Proveedor)input;
					return pp.getClave().trim().equals(source.getClave().trim());
				}
			});
			if(target!=null){
				copyProperties(source, target);
				@SuppressWarnings("unused")
				Proveedor res=(Proveedor)getUniversalDao().save(target);
			}else{
				System.out.println("Salvando nuevo bean: "+source);
				saveBean(source);
			}
				
		}
	}
	
	/*
	public void importar(String clave){
		String sql="select * from SW_PROVEEDORES a left join sw_unidades b on (a.unidad_id=b.UNIDAD_ID) where a.clave=?";
		List rows=getSourceJdbcTemplate().query(sql,new Object[]{clave}, getMapper());
		if(!rows.isEmpty()){
			saveBean(rows.get(0));
		}
	}
	
	public void importarFaltantes(){
		String sql="select distinct clave as CLAVE from sw_articulos";
		List<String> source=getSourceJdbcTemplate().queryForList(sql, String.class);
		String sql2="select distinct clave from sx_productos";
		List<String> target=getTargetJdbcTemplate().queryForList(sql2, String.class);
		//Collection<String> faltantes=CollectionUtils.disjunction(source, target);
		
		for(String clave:source){
			if(!target.contains(clave)){
				System.out.println("Falta: "+clave);
				importar(clave);
			}
		}
	}
	*/
	
	private void copyProperties(Proveedor source,Proveedor target){
		target.setNombre(source.getNombre());
		target.setDireccion(source.getDireccion());
		target.setRfc(source.getRfc());
		target.setPlazo(source.getPlazo());
		target.setCuentaContable(source.getCuentaContable());
		target.setActivo(source.isActivo());
		target.setDescuentoFinanciero(source.getDescuentoFinanciero());
		target.setDiasDescuentoF(source.getDiasDescuentoF());
	}
	
	private class ProveedorMapper implements RowMapper{
		public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
			Proveedor p=new Proveedor();
			p.setId(rs.getLong("ID"));
			p.setClave(rs.getString("CLAVE"));
			p.setNombre(rs.getString("NOMBRE"));
			Direccion d=new Direccion();
			d.setCalle(rs.getString("CALLE"));
			d.setColonia(rs.getString("COLONIA"));
			d.setCp(rs.getString("CP"));
			d.setCiudad(rs.getString("CIUDAD"));
			d.setMunicipio(rs.getString("MUNICIPIO"));
			d.setEstado(rs.getString("ENTIDAD"));
			p.setTelefono1(rs.getString("TEL1"));
			p.setTelefono2(rs.getString("TEL2"));
			p.setTelefono3(rs.getString("FAX"));
			p.setRfc("");
			//p.setRfc();
			p.setPlazo(rs.getInt("DIASDECREDITO"));
			String com1=rs.getString("OBSERVACIONES");
			if(!StringUtils.isBlank(com1)){
				p.agregarComentario(com1);
			}
			String com2=rs.getString("COMENTARIOPARAPEDIDO");
			if(!StringUtils.isBlank(com2)){
				p.agregarComentario(com2);
			}
			String rfc=rs.getString("RFC");
			if(!StringUtils.isBlank(rfc)){
				p.agregarComentario(rfc);
			}
			p.setContacto1(rs.getString("REPRESENTANTE"));
			p.setCuentaContable(rs.getString("CUENTACONTABLE"));
			p.setActivo(rs.getBoolean("ACTIVO"));
			p.setDescuentoFinanciero(rs.getDouble("DESCUENTOF"));
			p.setDiasDescuentoF(rs.getInt("DIASDF"));
			return p;
		}
		
	}

}
